package llama

import (
	"log"           // 标准日志包，用于输出调试/错误信息
	"os"            // 提供操作系统相关功能（如文件操作）
	"path/filepath" // 处理文件路径（如通配符匹配 .gguf 文件）
)

/**
 * @description: 获取指定目录下的第一个 .gguf 模型文件路径
 * @param {string} dir 需要查找的目录路径
 * @return {string} 找到的第一个 .gguf 文件路径，若未找到则返回空字符串
 */
func getFirstModel(dir string) string {
	// 使用 filepath.Glob 函数匹配目录下所有 .gguf 文件
	files, err := filepath.Glob(filepath.Join(dir, "*.gguf"))
	// 若出现错误或未找到任何 .gguf 文件，记录错误日志并返回空字符串
	if err != nil || len(files) == 0 {
		log.Printf("GGUF服务[ERROR] -> 模型目录[%s]为空或出错", dir)
		return ""
	}
	// 返回找到的第一个 .gguf 文件路径
	return files[0]
}

/**
 * @description: 获取指定类型模型的路径，优先使用直接指定的模型路径，若未指定或指定路径无效，则使用默认目录下的第一个模型路径
 * @param {string} modelType 模型类型，如 "embedding", "reasoning", "visualing" 等
 * @param {string} specifiedPath 直接指定的模型路径，若为 "void" 或空字符串，则表示未指定
 * @param {string} defaultDir 默认模型目录路径，当指定路径无效时会在此目录查找模型
 * @return {string} 找到的模型路径，若未找到则返回空字符串
 */
func getSpecifiedOrFirstModel(modelType, specifiedPath, defaultDir string) string {
	// 检查指定路径是否有效（既不是 "void" 也不是空字符串）
	if specifiedPath != "void" && specifiedPath != "" {
		// 尝试获取指定路径的文件信息，判断文件是否存在
		if _, err := os.Stat(specifiedPath); err == nil {
			// 若文件存在，记录日志并返回指定路径
			log.Printf("GGUF服务 -> 使用直接指定的[%s]模型: %s", modelType, specifiedPath)
			return specifiedPath
		} else {
			// 若文件不存在，记录警告日志，后续将使用默认路径
			log.Printf("GGUF服务[WARNING] -> 直接指定的[%s]模型文件不存在，使用默认路径: %s", modelType, defaultDir)
		}
	}
	// 使用默认目录，调用 getFirstModel 函数获取第一个模型路径
	return getFirstModel(defaultDir)
}
